package demo;

import java.lang.reflect.Array;

class MaArray<T>{
    public MaArray(Class<T> tClass,int capacity){
        obj = (T[]) Array.newInstance(tClass,capacity);
    }

    //但是这个还是以后最常用的手段
     Object[] obj = new Object[3];


    //改：
    public T[] obj1 = (T[])new Object[3];  // 暂且先强转一下，这样写其实是不对的，具体下面在介绍

   /* public Object getPos(int pos){
        return obj[pos];
    }
    public void setObj(int pos,Object val){
        obj[pos] = val;
    }*/

    //刚提出泛型后的修改：
    public T getPos(int pos){
        return obj1[pos];
    }
    public void setObj(int pos,T val){
        obj1[pos] = val;
    }


    // 解释泛型编译后的第二次修改
     /* public T getPos1(int pos){
        return (T)obj[pos];

    }
    public void setObj1(int pos,T val){
        obj[pos] = val;
    }*/

    public T[] getArray(){
        return obj1;
    }
}
public class Test {
    public static void main(String[] args) {
        //修改后的手段，这个手段叫做反射
        MaArray<Integer> maArray = new MaArray<>(Integer.class,10);
        maArray.setObj(0,10);
        maArray.setObj(1,20);
        Integer[] integer = maArray.getArray();  //只是这样的话 会报错，类型转换异常，相当于向上转型
        // 强制类型转换也不行，这里面是因为数组不是具体类型的数组
        //java是一个非常特殊的东西
        //解决方法
        // 提供一个构造方法
    }
    //实现一个通用的数组
    public static void main1(String[] args) {
        //MaArray maArray = new MaArray();

        //实例化对象的同时 ， 指定当前泛型类 的指定参数类型是Integer,只能存储Integer
        MaArray<Integer> maArray = new MaArray<Integer>(Integer.class,10);
        //在这里面泛型指定的类型必须是一个引用类型，不能是基本类型,可以省略后面<>内容

        maArray.setObj(0,10);
        maArray.setObj(1,10);
        maArray.setObj(2,10);

        //maArray.setObj(1,"hello");  //被指定后会报错
        //maArray.setObj(2,10.0);

        //double d = maArray.getPos(2);  //报错了
        //Object d = maArray.getPos(2); //掩耳盗铃,这只是不报错了，但是具体使用还是需要指明具体类型

        int d = maArray.getPos(2);  //这就不报错了

        // 问题：
        // 1.此时存储数据的时候。什么数据都可以存储
        // 2.此时获取数据的时候。必须得强转

        System.out.println("===========================");
        MaArray<String> maArray1 = new MaArray<>(String.class,10);
        maArray1.setObj(0,"hello");
        maArray1.setObj(1,"bit");

        String str = maArray1.getPos(1);


        //思考
        // 能不能就是，指定你放什么类型，这样就不用强转了
        // 这里指定的Object是不够好的
        //指定类型的方法就是：
        // 方法就是在MaArray 的 后面加一个 <>  在这里面写一个东西，写什么都行，比如T,P,M.....
        //  MaArray<T> 代表当前类是一个泛型类
        //写T之后的使用
    }
}
